home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 8 / FM Towns Free Software Collection 8.iso / t_os / otohime / src / lib / vibra.asm < prev   
Assembly Source File  |  1994-06-01  |  9KB  |  379 lines

  1. ;    PCM SOUND VIBRATO
  2. ;
  3. ;    call from F-BASIC386
  4. ;    callm address,varptr(snd.data),varptr(para),varptr(work area)
  5. ;
  6. ;
  7. ;        1990 3  Hiroshi TODA
  8. ;
  9. ;        1993 12 High C 用に改造
  10. ;
  11. ;    para:dl,mix1,mix2,md1,sp1,ang1,nd2,sp2,ang2
  12. ;
  13.  
  14.  
  15.     .386p
  16.  
  17.  
  18. param    struc
  19.  
  20.     dd    ?
  21.     dd    ?
  22. sndadd    dd    ?        ; snd.data address
  23. paradd    dd    ?        ; para. address
  24. wadd    dd    ?         ; work address
  25.  
  26. param   ends
  27.  
  28.  
  29. work    struc
  30.  
  31. ;data area
  32.  
  33. del    dd    ?        ; delay Byte
  34. mix1    dd    ?        ; main mix rate
  35. mix2    dd    ?        ; vibrato mix rate
  36. md1    dd    ?        ; modulation1
  37. sp1    dd    ?        ; speed1 (90 = 10000H)
  38. ang1    dd    ?        ; angle1
  39. md2    dd    ?        ; modulation2
  40. sp2    dd    ?        ; speed2 (90 = 10000H)
  41. ang2    dd    ?        ; angle2
  42.  
  43. point0    dd    ?        ; 10000H-point1
  44. point1    dd    ?        ; ov.sampling point (decimal)
  45. point2    dd    ?        ; ov.sampling point (integer)
  46. buf1    dd    ?        ; sampling add buf.
  47.  
  48. work    ends
  49.  
  50.  
  51. cseg    segment    dword public use32 'CODE'
  52.     assume    cs:cseg,ds:cseg
  53.  
  54.     public    sndVibrato
  55.     db    'sndVibrato',10
  56. sndVibrato    proc    near
  57.     push    ebp
  58.     mov    ebp,esp
  59.     push    esi
  60.     push    edi
  61.     push    ebx
  62.  
  63.     mov    esi,[ebp].wadd        ; esi <-- work area top add
  64.     mov    edi,[ebp].sndadd    ; edi <-- snd.data add.
  65.     mov    ecx,[ebp].paradd    ; ecx <-- para. add.
  66.     xor    edx,edx            ; edx=count
  67. main01:    mov    eax,[ecx][edx*4]    ; para. --> work area
  68.     mov    [esi][edx*4],eax
  69.     inc    edx
  70.     cmp    edx,9
  71.     jb    main01
  72.     mov    ecx,[edi+12]        ; length
  73.     sub    ecx,[esi].del
  74.     jbe    mainE                ; jb を jbe に変更 1993 12
  75.     add    edi,[esi].del
  76.     add    edi,32
  77.  
  78. main02:    mov    [esi].point2,edi    ; ov.sampling point cal.
  79.     xor    eax,eax
  80.     mov    [esi].point1,eax
  81.     mov    eax,[esi].ang1
  82.     call    sin            ; eax = sin(eax)*10000H
  83.     imul    dword ptr [esi].md1
  84.     mov    [esi].buf1,eax
  85.     mov    eax,[esi].ang2
  86.     call    sin            ; eax = sin(eax)*10000H
  87.     imul    dword ptr [esi].md2
  88.     add    eax,[esi].buf1
  89.     cdq
  90.     add    [esi].point1+2,eax
  91.     adc    word ptr [esi].point2+2,dx
  92.  
  93.     lea    eax,[esi].point1    ; over sampling
  94.     call    smp
  95.  
  96.     imul    eax,[esi].mix2        ; mix
  97.     mov    [esi].buf1,eax
  98.     xor    ebx,ebx
  99.     sub    ebx,[esi].del
  100.     mov    al,[edi][ebx]
  101.     and    eax,0ffH
  102.     cmp    eax,128
  103.     jb    main05
  104.     mov    edx,eax
  105.     mov    eax,128
  106.     sub    eax,edx
  107. main05:    imul    eax,[esi].mix1
  108.     add    eax,[esi].buf1
  109.     sar    eax,8
  110.     js    main07            ; eax --> pcm data
  111.     je    main07
  112.     cmp    eax,128            ; +
  113.     jb    main08
  114.     mov    eax,127
  115.     jmp    main08
  116. main07:    mov    edx,eax            ; -
  117.     mov    eax,128
  118.     sub    eax,edx
  119.     cmp    eax,256-1    ; data255はloopStopの意味があるから除外 1993 12
  120.     jb    main08
  121.     mov    eax,255-1    ; data255はloopStopの意味があるから除外 1993 12
  122. main08:    mov    [edi][ebx],al
  123.  
  124.     mov    eax,[esi].sp1
  125.     add    [esi].ang1,eax
  126.     mov    eax,[esi].sp2
  127.     add    [esi].ang2,eax
  128.     inc    edi
  129.     dec    ecx
  130.     jne    main02
  131.  
  132. mainE:
  133.     pop    ebx
  134.     pop    edi
  135.     pop    esi
  136.     mov    esp,ebp
  137.     pop    ebp
  138.     ret
  139.  
  140. ;    OVER SAMPLING for PCM DATA(8bit)
  141. ;input    eax = 64bit(32bit/decimal,32bit/integer) data address(ds:)
  142. ;output    eax = over sampring data ( 32bit sign (-128 -- +127) )
  143.  
  144. smp:    push    ebx
  145.     push    ecx
  146.     push    edx
  147.     push    esi
  148.     push    edi
  149.     mov    ebx,[eax]        ; ebx = decimal
  150.     mov    esi,[eax+4]        ; esi = integer
  151.     shr    ebx,24            ; ebx --> 8bit
  152.     jne    smp00
  153.  
  154.     mov    al,[esi]        ; decimal=0
  155.     and    eax,0ffH
  156.     cmp    eax,128
  157.     jb    smp0A
  158.     mov    edx,eax
  159.     mov    eax,128
  160.     sub    eax,edx
  161. smp0A:    jmp    smp06
  162.  
  163. smp00:
  164.     mov    eax,[esi-1]        ; 周囲がみな無信号ならノイズを出さないよう直接0を返す
  165.     cmp    eax,80808080h
  166.     jne    smp0B
  167.     xor    eax,eax
  168.     jmp    smp06
  169.  
  170. smp0B:
  171.     call    smp01
  172. smp01:    pop    edi
  173.     add    edi,smptb-smp01        ; edi = table point
  174.  
  175.     mov    al,[esi]
  176.     and    eax,0ffH
  177.     cmp    eax,128
  178.     jb    smp02
  179.     mov    edx,eax
  180.     mov    eax,128
  181.     sub    eax,edx
  182. smp02:    add    eax,128
  183.     mul    byte ptr cs:[edi][ebx]
  184.     mov    ecx,eax
  185.  
  186.     mov    al,[esi-1]
  187.     and    eax,0ffH
  188.     cmp    eax,128
  189.     jb    smp03
  190.     mov    edx,eax
  191.     mov    eax,128
  192.     sub    eax,edx
  193. smp03:    add    eax,128
  194.     mul    byte ptr cs:[edi][ebx+256]
  195.     sub    ecx,eax
  196.  
  197.     mov    eax,ebx            ; ebx = 256 - ebx
  198.     mov    ebx,256
  199.     sub    ebx,eax
  200.  
  201.     mov    al,[esi+1]
  202.     and    eax,0ffH
  203.     cmp    eax,128
  204.     jb    smp04
  205.     mov    edx,eax
  206.     mov    eax,128
  207.     sub    eax,edx
  208. smp04:    add    eax,128
  209.     mul    byte ptr cs:[edi][ebx]
  210.     add    ecx,eax
  211.  
  212.     mov    al,[esi+2]
  213.     and    eax,0ffH
  214.     cmp    eax,128
  215.     jb    smp05
  216.     mov    edx,eax
  217.     mov    eax,128
  218.     sub    eax,edx
  219. smp05:    add    eax,128
  220.     mul    byte ptr cs:[edi][ebx+256]
  221.     sub    ecx,eax
  222.     sub    ecx,128*256
  223.     sar    ecx,8
  224.     mov    eax,ecx
  225.  
  226. smp06:    pop    edi
  227.     pop    esi
  228.     pop    edx
  229.     pop    ecx
  230.     pop    ebx
  231.     ret    
  232.  
  233. smptb    db    255,255,255,254,254,253,253,252
  234.     db    252,251,251,250,249,249,248,248
  235.     db    247,246,246,245,244,244,243,243
  236.     db    242,241,240,240,239,238,238,237
  237.     db    236,236,235,234,233,233,232,231
  238.     db    230,229,229,228,227,226,225,225
  239.     db    224,223,222,221,221,220,219,218
  240.     db    217,216,215,214,214,213,212,211
  241.     db    210,209,208,207,206,205,204,204
  242.     db    203,202,201,200,199,198,197,196
  243.     db    195,194,193,192,191,190,189,188
  244.     db    187,186,185,184,183,182,181,180
  245.     db    179,178,177,176,175,174,172,171
  246.     db    170,169,168,167,166,165,164,163
  247.     db    162,161,160,158,157,156,155,154
  248.     db    153,152,151,150,148,147,146,145
  249.     db    144,143,142,141,139,138,137,136
  250.     db    135,134,133,132,130,129,128,127
  251.     db    126,125,123,122,121,120,119,118
  252.     db    117,115,114,113,112,111,110,108
  253.     db    107,106,105,104,103,101,100,099
  254.     db    098,097,096,094,093,092,091,090
  255.     db    089,087,086,085,084,083,082,080
  256.     db    079,078,077,076,075,073,072,071
  257.     db    070,069,068,067,065,064,063,062
  258.     db    061,060,058,057,056,055,054,053
  259.     db    052,051,049,048,047,046,045,044
  260.     db    043,042,040,039,038,037,036,035
  261.     db    034,033,032,030,029,028,027,026
  262.     db    025,024,023,022,021,020,019,018
  263.     db    016,015,014,013,012,011,010,009
  264.     db    008,007,006,005,004,003,002,001
  265.  
  266.     db    000,000,001,001,001,002,002,002
  267.     db    003,003,003,003,004,004,004,005
  268.     db    005,005,005,006,006,006,006,007
  269.     db    007,007,007,008,008,008,008,009
  270.     db    009,009,009,009,010,010,010,010
  271.     db    010,011,011,011,011,011,011,012
  272.     db    012,012,012,012,012,013,013,013
  273.     db    013,013,013,013,014,014,014,014
  274.     db    014,014,014,014,014,015,015,015
  275.     db    015,015,015,015,015,015,015,015
  276.     db    015,016,016,016,016,016,016,016
  277.     db    016,016,016,016,016,016,016,016
  278.     db    016,016,016,016,016,016,016,016
  279.     db    016,016,016,016,016,016,016,016
  280.     db    016,016,016,016,016,016,016,016
  281.     db    016,016,016,016,016,016,016,016
  282.     db    016,016,016,016,016,016,016,016
  283.     db    016,016,015,015,015,015,015,015
  284.     db    015,015,015,015,015,015,015,015
  285.     db    014,014,014,014,014,014,014,014
  286.     db    014,014,014,013,013,013,013,013
  287.     db    013,013,013,013,012,012,012,012
  288.     db    012,012,012,012,012,011,011,011
  289.     db    011,011,011,011,011,010,010,010
  290.     db    010,010,010,010,009,009,009,009
  291.     db    009,009,009,008,008,008,008,008
  292.     db    008,008,007,007,007,007,007,007
  293.     db    007,006,006,006,006,006,006,005
  294.     db    005,005,005,005,005,004,004,004
  295.     db    004,004,004,003,003,003,003,003
  296.     db    003,002,002,002,002,002,002,001
  297.     db    001,001,001,001,001,000,000,000
  298.  
  299.  
  300.  
  301. sin:    push    ebx
  302.     push    ecx
  303.     push    edx
  304.     mov    edx,eax
  305.     and    edx,30000H
  306.     cmp    edx,10000H
  307.     je    sin01
  308.     cmp    edx,30000H
  309.     je    sin01
  310.     jmp    sin02
  311. sin01:    mov    bx,ax
  312.     mov    ax,0ffffH
  313.     sub    ax,bx
  314. sin02:    and    eax,0ffffH
  315.     call    sin03
  316. sin03:    pop    ecx
  317.     add    ecx,sintb-sin03
  318.     push    eax
  319.     shr    eax,8
  320.     mov    bx,cs:[ecx][eax*2]
  321.     mov    cx,cs:[ecx+2][eax*2]
  322.     and    ebx,0ffffH
  323.     and    ecx,0ffffH
  324.     sub    ecx,ebx
  325.     pop    eax
  326.     and    eax,0ffH
  327.     imul    eax,ecx
  328.     shr    eax,8
  329.     add    eax,ebx
  330.     cmp    edx,20000H
  331.     jb    sin04
  332.     mov    ebx,eax
  333.     xor    eax,eax
  334.     sub    eax,ebx
  335. sin04:    pop    edx
  336.     pop    ecx
  337.     pop    ebx
  338.     ret
  339.  
  340. sintb    dw    00000H,00192H,00324H,004B6H,00648H,007DAH,0096CH,00AFDH
  341.     dw    00C8FH,00E21H,00FB2H,01143H,012D5H,01465H,015F6H,01787H
  342.     dw    01917H,01AA7H,01C37H,01DC6H,01F56H,020E5H,02273H,02402H
  343.     dw    0250FH,0271DH,028AAH,02A37H,02BC3H,02D4FH,02EDBH,03066H
  344.     dw    031F1H,0337BH,03505H,0368EH,03816H,0399EH,03B26H,03CADH
  345.     dw    03E33H,03FB9H,0413EH,042C3H,04447H,045CAH,0474CH,048CEH
  346.     dw    04A4FH,04BD0H,04D4FH,04ECEH,0504DH,051CAH,05347H,054C3H
  347.     dw    0563EH,057B8H,05931H,05AAAH,05C21H,05D98H,05F0EH,06083H
  348.     dw    061F7H,0636AH,064DCH,0664DH,067BDH,0692CH,06A9AH,06C07H
  349.     dw    06D73H,06EDEH,07048H,071B1H,07319H,0747FH,075E5H,07749H
  350.     dw    078ACH,07A0FH,07B64H,07CCFH,07E2EH,07F8DH,080E7H,08242H
  351.     dw    0839BH,084F3H,0864AH,087A0H,088F5H,08A48H,08B99H,08CEAH
  352.     dw    08E39H,08F86H,090D3H,0921EH,09367H,094AFH,095F6H,0973BH
  353.     dw    0987FH,099C1H,09B02H,09C41H,09D7FH,09EBBH,09FF6H,0A12FH
  354.     dw    0A266H,0A39CH,0A4D1H,0A604H,0A735H,0A865H,0A993H,0AABFH
  355.     dw    0ABEAH,0AD13H,0AE3BH,0AF60H,0B085H,0B1A7H,0B2C8H,0B3E6H
  356.     dw    0B504H,0B61FH,0B739H,0B851H,0B967H,0BA7BH,0BB8EH,0BC9FH
  357.     dw    0BDAEH,0BEBBH,0BFC6H,0C0D0H,0C1D7H,0C2DDH,0C3E1H,0C4E3H
  358.     dw    0C5E3H,0C6E1H,0C7DDH,0C8D7H,0C9D0H,0CAC6H,0CBBBH,0CCADH
  359.     dw    0CD9EH,0CE8CH,0CF79H,0D063H,0D14CH,0D232H,0D317H,0D3F9H
  360.     dw    0D4DAH,0D5B8H,0D695H,0D76FH,0D847H,0D91DH,0D9F1H,0DAC3H
  361.     dw    0DB93H,0DC60H,0DD2CH,0DDF5H,0DEBDH,0DF82H,0E045H,0E106H
  362.     dw    0E1C4H,0E281H,0E33BH,0E3F3H,0E4A9H,0E55DH,0E60EH,0E6BDH
  363.     dw    0E76AH,0E815H,0E8BEH,0E964H,0EA08H,0EAAAH,0EB4AH,0EBE7H
  364.     dw    0EC82H,0ED1BH,0EDB1H,0EE45H,0EED7H,0EF67H,0EFF4H,0F07FH
  365.     dw    0F108H,0F18EH,0F212H,0F293H,0F313H,0F390H,0F40AH,0F483H
  366.     dw    0F4F9H,0F56CH,0F5DDH,0F64CH,0F6B9H,0F723H,0F78AH,0F7F0H
  367.     dw    0F852H,0F8B3H,0F911H,0F96DH,0F9C6H,0FA1DH,0FA72H,0FAC4H
  368.     dw    0FB13H,0FB60H,0FBABH,0FBF4H,0FC3AH,0FC7DH,0FCBEH,0FCFDH
  369.     dw    0FD39H,0FD73H,0FDAAH,0FDDFH,0FE12H,0FE42H,0FE6FH,0FE9AH
  370.     dw    0FEC3H,0FEE9H,0FF0DH,0FF2EH,0FF2EH,0FF4DH,0FF83H,0FF9BH
  371.     dw    0FFB0H,0FFC2H,0FFD2H,0FFE0H,0FFEBH,0FFF3H,0FFFAH,0FFFDH
  372.     dw    0FFFFH
  373.  
  374. sndVibrato    endp
  375.  
  376. cseg    ends
  377.     end
  378.